import io
import os
import uuid
from datetime import datetime
from typing import Optional
import edge_tts
from fastapi import HTTPException
from app.config.logging_config import get_logger
from app.services.audio_manager import audio_manager

# 获取音频模块专用的日志记录器
logger = get_logger(__name__, "audio")


class EdgeTTSService:
    """Edge TTS服务类，提供流式文本转语音功能"""
    
    def __init__(self):
        self.default_voice = "zh-CN-YunyangNeural"  # 默认中文男声（云扬-睿智老人音色）
        self.default_rate = "+10%"  # 适中语速，符合老人说话节奏
        self.default_pitch = "+0Hz"  # 默认音调
    

    async def text_to_speech_bytes(self, 
                                 text: str, 
                                 voice: Optional[str] = None,
                                 rate: Optional[str] = None,
                                 pitch: Optional[str] = None) -> bytes:
        """将文本转换为完整的音频字节数据
        
        Args:
            text: 要转换的文本
            voice: 语音名称
            rate: 语速
            pitch: 音调
            
        Returns:
            bytes: 完整的音频数据
        """
        logger.info(f"🎤 收到文字转语音请求")
        logger.info(f"📝 文本内容: {text[:100]}{'...' if len(text) > 100 else ''}")
        logger.info(f"🔊 文本长度: {len(text)} 字符")
        
        if not text or not text.strip():
            logger.error("❌ 文本内容为空")
            raise HTTPException(status_code=400, detail="文本内容不能为空")
        
        # 使用默认值
        voice = voice or self.default_voice
        rate = rate or self.default_rate
        pitch = pitch or self.default_pitch
        
        logger.info(f"🎵 语音参数: voice={voice}, rate={rate}, pitch={pitch}")
        
        try:
            logger.info("🚀 开始创建TTS通信对象...")
            # 创建TTS通信对象
            communicate = edge_tts.Communicate(text, voice, rate=rate, pitch=pitch)
            
            logger.info("📡 开始生成音频数据...")
            audio_data = io.BytesIO()
            chunk_count = 0
            total_bytes = 0
            
            # 生成音频数据
            async for chunk in communicate.stream():
                if chunk["type"] == "audio":
                    chunk_count += 1
                    chunk_size = len(chunk["data"])
                    total_bytes += chunk_size
                    audio_data.write(chunk["data"])
                    
                    if chunk_count % 10 == 0:  # 每10个chunk打印一次日志
                        logger.debug(f"📦 已生成 {chunk_count} 个音频块，总计 {total_bytes} 字节")
            
            final_size = len(audio_data.getvalue())
            logger.debug(f"✅ 音频生成完成！总共生成 {chunk_count} 个音频块，最终文件大小: {final_size} 字节")
            
            return audio_data.getvalue()
                    
        except Exception as e:
            logger.error(f"❌ 语音合成失败: {str(e)}")
            raise HTTPException(status_code=500, detail=f"语音合成失败: {str(e)}")
    
    async def text_to_speech_file(self, 
                                 text: str, 
                                 voice: Optional[str] = None,
                                 rate: Optional[str] = None,
                                 pitch: Optional[str] = None) -> str:
        """将文本转换为音频文件并返回URL
        
        Args:
            text: 要转换的文本
            voice: 语音名称
            rate: 语速
            pitch: 音调
            
        Returns:
            str: 音频文件的URL路径
        """
        logger.info(f"🎤 收到文字转语音文件请求")
        logger.info(f"📝 文本内容: {text[:100]}{'...' if len(text) > 100 else ''}")
        logger.info(f"🔊 文本长度: {len(text)} 字符")
        
        if not text or not text.strip():
            logger.error("❌ 文本内容为空")
            raise HTTPException(status_code=400, detail="文本内容不能为空")
        
        # 确保音频文件目录存在
        audio_dir = "audio_files"
        if not os.path.exists(audio_dir):
            os.makedirs(audio_dir)
            logger.info(f"📁 创建音频文件目录: {audio_dir}")
        
        # 生成唯一文件名
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        unique_id = str(uuid.uuid4())[:8]
        filename = f"tts_{timestamp}_{unique_id}.mp3"
        file_path = os.path.join(audio_dir, filename)
        
        logger.info(f"📄 生成文件名: {filename}")
        
        # 使用默认值
        voice = voice or self.default_voice
        rate = rate or self.default_rate
        pitch = pitch or self.default_pitch
        
        logger.info(f"🎵 语音参数: voice={voice}, rate={rate}, pitch={pitch}")
        
        try:
            logger.info("🚀 开始创建TTS通信对象...")
            # 创建TTS通信对象
            communicate = edge_tts.Communicate(text, voice, rate=rate, pitch=pitch)
            
            logger.info(f"💾 开始生成音频文件: {file_path}")
            
            # 直接保存到文件
            await communicate.save(file_path)
            
            # 检查文件是否生成成功
            if os.path.exists(file_path):
                file_size = os.path.getsize(file_path)
                logger.info(f"✅ 音频文件生成成功！文件大小: {file_size} 字节")
                
                # 注册到音频管理器
                audio_manager.register_audio_file(filename, file_path)
                
                # 返回相对于服务器根目录的URL路径
                audio_url = f"/audio/{filename}"
                logger.info(f"🔗 音频文件URL: {audio_url}")
                return audio_url
            else:
                logger.error("❌ 音频文件生成失败：文件不存在")
                raise HTTPException(status_code=500, detail="音频文件生成失败")
                    
        except Exception as e:
            logger.error(f"❌ 语音合成失败: {str(e)}")
            # 清理可能生成的不完整文件
            if os.path.exists(file_path):
                try:
                    os.remove(file_path)
                    logger.info(f"🗑️ 清理不完整文件: {file_path}")
                except:
                    pass
            raise HTTPException(status_code=500, detail=f"语音合成失败: {str(e)}")
    



# 创建全局TTS服务实例
tts_service = EdgeTTSService()